#include <string>
#include "stdio.h"

using namespace std;

//定义单链表节点
class  LNode{
    public:
        int data;  //存放数据
        LNode *link;  //指向后继的指针
        LNode(int _data){   //构造函数
            data = _data;
            link = NULL;  //初始化为空
        }
};


//定义单链表类
class SingleList
{
    private:
        LNode *head;  //头指针
        LNode *last;  //尾指针
        int length;   //链表长度
        char errorMsg; //错误信息

    public:
        //初始化
        SingleList(){
            head = NULL;
            last= NULL;
            length=0;
        };
       
        /*
         *  插入节点
         *  @param  *node LNode 类型的指针，要插入的节点
         *  @param  pos   int 类型 ，要插入的位置
         *
         */
        int insert(LNode *node, int pos){
            //如果链表为空,直接为一个节点
            if(head ==NULL){
                head = node;
                last = node;
                length++;
                return -1;
            }    

            //检验插入结点
            if(pos <0 || pos >length+1){
                sprintf(&errorMsg,"max length: %d", length);
                return 0;  //超出链表范围则直接返回
            }
            //如果插入头结点
            if(pos ==0){
                node->link = head;
                head = node; 
            }else if(pos == length+1){
                //结尾插入结点
                LNode *curNode = head;
                int i = 0;
                //找到最后的节点
                while(curNode->link !=NULL){
                    curNode = curNode->link;
                }
                node->link = curNode->link;
                curNode->link= node;
                last = node; 
            }else{
                //插入链表中
                LNode *curNode = head;
                int i = 0;
                while(curNode->link !=NULL && i != pos){
                        curNode = curNode->link;
                        i++;
                }
                if(curNode->link == NULL){
                    last = node;
                }
                node->link = curNode->link;
                curNode->link= node;
            }

            //长度加1
            length++;
        } 

        //获取第一个节点
        LNode *getHead(){
            return head;
        }

        //设置新的头指针，并计算整个链表的长度
        void setHead(LNode *p){
            head = p;
            int i =0;
            while(p != NULL){
                if(p->link != NULL){
                    p=p->link;
                    last = p;
                }else{
                    p = NULL;
                }
                i++;
            }
            length = i;
        }

        int getLen(){
            return length;
        }
        

        //获取尾节点
        LNode *getLast()
        {
            return last;
        }

        //按顺序输出链表
        void output()
        {
            if(head == NULL){
                return ;
            }
            LNode *curNode = head;
            while(curNode !=NULL){
                cout << curNode->data<< " ";
                curNode = curNode->link;
            }
            cout <<""<<endl;
        }

};
